package signature

import (
	"crypto/rsa"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"strings"
)

// EncodeAndSignToken 编码和签名Token
func EncodeAndSignToken(token interface{}, priv *rsa.PrivateKey) (string, error) {
	bytes, err := json.Marshal(token)
	if err != nil {
		return ``, err
	}
	sig, err := Sign(bytes, priv)
	if err != nil {
		return ``, err
	}
	return base64.StdEncoding.EncodeToString(bytes) + `.` + base64.StdEncoding.EncodeToString(sig), nil
}

// CheckToken 验证Token签名是否正确，如果正确则使用Json反序列化为传入结构
func CheckToken(tokenStr string, pub *rsa.PublicKey, token interface{}) error {
	// 将Token字符串还原成数据和签名
	vec := strings.Split(tokenStr, `.`)
	if len(vec) != 2 {
		return fmt.Errorf(`Invalid token string`)
	}
	bytes, err := base64.StdEncoding.DecodeString(vec[0])
	if err != nil {
		return err
	}
	sig, err := base64.StdEncoding.DecodeString(vec[1])
	if err != nil {
		return err
	}

	// 验证签名
	_, err = Verify(bytes, sig, pub)
	if err != nil {
		return err
	}

	// 反序列化Token
	err = json.Unmarshal(bytes, token)
	if err != nil {
		return err
	}
	return nil
}
